﻿using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;

namespace WpfApp.View.SystemInformation
{
    /// <summary>
    /// WD_InsertStaffInformation.xaml 的交互逻辑
    /// </summary>
    public partial class WD_InsertStaffInformation : Window
    {
        int intNumber;
        public WD_InsertStaffInformation(int intN)
        {
            InitializeComponent();
            //目前最大单号
            intNumber = intN;
        }
        BLL.UCStaffInformation.UC_StaffInformationClient myStaff = new BLL.UCStaffInformation.UC_StaffInformationClient();
        /// <summary>
        /// 页面加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InsertStaffInformation_Loaded(object sender, RoutedEventArgs e)
        {
            #region 绑定下拉框
            //查询性别
            DataTable dt = myStaff.SelectGender().Tables[0];
            cbo_gender.ItemsSource = dt.DefaultView;
            cbo_gender.DisplayMemberPath = "GenderName";
            cbo_gender.SelectedValuePath = "GenderId";
            //查询工作状态
            DataTable dtWorkStatus = myStaff.SelectWorkStatus().Tables[0];
            cbo_Work.ItemsSource = dtWorkStatus.DefaultView;
            cbo_Work.DisplayMemberPath = "WorkStatusName"; 
            cbo_Work.SelectedValuePath = "WorkStatusId";
            //查询职务
            DataTable dtPost = myStaff.SelectPost().Tables[0];
            cbo_Post.ItemsSource = dtPost.DefaultView;
            cbo_Post.DisplayMemberPath = "PostName";
            cbo_Post.SelectedValuePath = "PostId";
            #endregion
            #region 自动生成编号
            int intNewNumber = intNumber + 1;
            string strNumber = intNewNumber.ToString();
            string strLeng = "";
            switch (strNumber.Length)
            {
                case 1:
                    strLeng = "000" + strNumber;
                    break;
                case 2:
                    strLeng = "00" + strNumber;
                    break;
                case 3:
                    strLeng = "0" + strNumber;
                    break;
                case 4:
                    strLeng = strNumber;
                    break;
                default:
                    break;
            }
            txt_Number.Text = "YG" + strLeng;
            #endregion
        }
        /// <summary>
        /// 临时列表（用于存储图片）
        /// </summary>
        List<byte[]> listByte = new List<byte[]>();
        /// <summary>
        /// 上传图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Open_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                //声明两个局部变量
                Stream photo = null;
                //打开对话框（选择图片）
                OpenFileDialog ofdWenJian = new OpenFileDialog();
                //允许用户选择多个文件。
                ofdWenJian.Multiselect = true;//多选图片
                ofdWenJian.Filter = "ALL Image Files|*.*";
                //显示对话框
                if ((bool)ofdWenJian.ShowDialog())
                {
                    //选定的文件(选定的文件打开只读流)
                    if ((photo = ofdWenJian.OpenFile()) != null)
                    {
                        // (2)获取图片
                        //获取文件长度（用字节表示的流长度 ）
                        int length = (int)photo.Length;
                        //声明数组
                        byte[] bytes = new byte[length];
                        //读取文件（字节数组，从零开始的字节偏移量，读取的字节数）
                        photo.Read(bytes, 0, length);
                        listByte.Add(bytes);
                        BitmapImage images = new BitmapImage(new Uri(ofdWenJian.FileName));
                        //绑定图片
                        img_photo.Source = images;
                        txt_Load.Text = ofdWenJian.FileName;

                    }
                    else
                    {
                        MessageBox.Show("对话框没有显示，没办法选择图片！", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
                    }
                }
                else
                {
                    MessageBox.Show("对话框没有显示，没办法选择图片！", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("绑定图片出错，请重新选择！", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
            }
        }
        /// <summary>
        /// 新增保存按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                //1、提取上传的文件
                byte[][] bytepicture = new byte[listByte.Count][];
                for (int i = 0; i < listByte.Count; i++)
                {
                    bytepicture[i] = listByte[i];
                }
                //2.判断必填项不能为空
                if (cbo_StaffType.SelectedValue != null && cbo_Work.SelectedValue!= null
                    && cbo_Post.SelectedValue!= null && txt_Name.Text.ToString() != string.Empty
                    && txt_Number.Text.ToString() != string.Empty && cbo_gender.SelectedValue!= null
                    && txt_idCar.Text.ToString() != string.Empty && dtp_Birthday.Text.ToString() != string.Empty
                    && dtp_EnterDate.Text.ToString() != string.Empty && dtp_LeaveDate.Text.ToString() != string.Empty)
                {
                    //3.获取页面输入的内容
                    int intas_employee_type_id = Convert.ToInt32(cbo_StaffType.SelectedValue);
                    int intas_work_status_id = Convert.ToInt32(cbo_Work.SelectedValue);
                    int intas_branch_id = Convert.ToInt32(cbo_Post.SelectedValue);
                    string strstaff_name = txt_Name.Text.ToString();
                    string strstaff_number = txt_Number.Text.ToString();
                    int intas_gender_id = Convert.ToInt32(cbo_gender.SelectedValue);
                    string strage = txt_Age.Text.ToString();
                    string strid_card = txt_idCar.Text.ToString();
                    DateTime dtmbirth = Convert.ToDateTime(dtp_Birthday.Text.ToString());
                    string strphone_number = txt_PhoneNumber.Text.ToString();
                    string straddress = txt_Address.Text.ToString();
                    string stre_mail = txt_Email.Text.ToString();
                    DateTime dtmentry_date = Convert.ToDateTime(dtp_EnterDate.Text.ToString());
                    DateTime dtmdeparture_date = Convert.ToDateTime(dtp_LeaveDate.Text.ToString());
                    bool bloperator_no = (bool)chk_operator.IsChecked;//获取checkbox
                    string strnote = txt_Note.Text.ToString();
                    //4.新增保存
                    int count = myStaff.InsertStaffInformation(intas_employee_type_id, intas_work_status_id, intas_branch_id, strstaff_name, strstaff_number, intas_gender_id, strage, strid_card,
                   dtmbirth, strphone_number, straddress, stre_mail, dtmentry_date, dtmdeparture_date, bloperator_no, bytepicture, strnote);
                    //5、判断
                    if (count > 0)
                    {
                        MessageBoxResult dr = MessageBox.Show("新增员工资料成功！", "系统提示", MessageBoxButton.OKCancel,
                           MessageBoxImage.Information); //弹出确定对话框
                        this.Close();
                        
                    }
                    else if (count == -1)
                    {
                        MessageBox.Show("新增员工重复！", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
                    }



                }
                else
                {
                    MessageBox.Show("员工资料还没完整填完，请继续！", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
                }
               
            }
            catch (Exception)
            {

                throw;
            }
        }
        
        /// <summary>
        /// 职务下拉框（选中改变事件）
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbo_Post_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                //获取选中职务
                int intID = Convert.ToInt32(cbo_Post.SelectedValue);
                if (intID > 0)
                {
                    DataTable dt = myStaff.SelectEmployeeType(intID).Tables[0];
                    cbo_StaffType.ItemsSource = dt.DefaultView;
                    cbo_StaffType.DisplayMemberPath = "EmployeeTypeName";
                    cbo_StaffType.SelectedValuePath = "EmployeeTypeId";
                }

            }
            catch (Exception)
            {
                cbo_StaffType.ItemsSource = null;
            }
        }
       /// <summary>
       /// 验证身份证
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>

        private void txt_idCar_TextChanged(object sender, TextChangedEventArgs e)
        {
            /*
            1、身份证号码组成结构
        　　  中国居民身份证号码有18位,是由17位数字本体码与1位校验码组合而成。从左至右分别为：数字地址码(6位身份证归属地号码)、居身出生日期(8位)、顺序码(3位)、校验码(由统一公式算出：1位)
        　　  2、数字地址码--身份归属地(前6位)
        　　  该编码按GB/T2260的规定执行编制，是居民常住户口所在县(市、旗、区)的行政区划代码。
        　　  3、数字出生日期(第7位至14位)
        　　  该编码按GB/T7408的规定执行,表示居民身份证对象出生年月日，该码由年月日连续数字组成，中间无分隔符。
        　　  4、数字顺序码(第15位至17位)
        　　  该顺序码的奇数分配给男性，偶数分配给女性，它是在同一数字地址码所标识的区域范围内(县、市、旗、区)，对同年同月同日生的人按顺序编定的顺序号。
        　　  5、数字校验码(最后1位)
        　　  最后1位的校验码是由，国家归定按号码编制单位统一的公式计算而得的，由于该位只有1位(否则身份证变成19位)，当算得尾号为0-9时，即为所得尾号，但算得尾号为10，就用X来代替该位，以符合中国国家标准位数。
        　　  PS:X为罗马数字的10。
                */
            string strIdCard = txt_idCar.Text.Trim();
            try
            {
                //（1）获取归属地
                if (strIdCard.Length > 6)
                {
                    string strAdress = strIdCard.Substring(0, 6);
                    string strAddress = Tools.Utils.CheckIDCardGetDiQu.LoadAddress(strAdress);
                    if (strAddress == "")
                    {
                        MessageBox.Show("身份证不合法！");
                    }
                    else
                    {
                        txt_Address.Text = strAddress;
                    }
                }
                
                //（2）验证身份证合理性
                if (strIdCard.Length == 18)
                {
                    if (Tools.Utils.CheckTrueOrFalse.checkIdCard(strIdCard))
                    {
                        //（2）出生年月、
                        string keys = strIdCard;
                        //年Substring(开始索引, 截取字符长度)
                        string birth_y = keys.Substring(6, 4);
                        //月
                        string birth_m = keys.Substring(10, 2);
                        //日
                        string birth_d = keys.Substring(12, 2);
                        //绑定出生日期
                        dtp_Birthday.Text = birth_y + "年" + birth_m + "月" + birth_d + "日";
                        //（2）性别
                        int sex = int.Parse(keys.Substring(16, 1));
                        //取余
                        if (sex % 2 == 0)
                        {
                            //女
                            cbo_gender.SelectedValue = 79;//79跟下拉框ID值对应
                        }
                        else
                        {
                            //男
                            cbo_gender.SelectedValue = 78;//78跟下拉框ID值对应
                        }
                        //(3)年龄
                        //获取今年年份
                        string strNow = DateTime.Now.Year.ToString();
                        //把今年转化成数字
                        decimal decNow = Convert.ToDecimal(strNow);
                        //获取（截取身份证）出生年份
                        decimal decbirth_y = Convert.ToDecimal(birth_y);
                        //获取虚岁
                        decimal deAge = Convert.ToDecimal(decNow - decbirth_y) + 1;
                        //绑定年龄
                        txt_Age.Text = deAge.ToString().Trim();
                    }
                    else
                    {
                        MessageBox.Show("身份证号码错误");
                    }
                }
                if (strIdCard.Length < 14)
                {
                    txt_Age.Text = "";
                    dtp_Birthday.Text = "";
                }
                if (strIdCard.Length < 6)
                {
                    txt_Address.Text = "";
                }
                if(strIdCard.Length < 17)
                {
                    cbo_gender.Text = "";
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        
        /// <summary>
        /// 清空图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Clean_Click(object sender, RoutedEventArgs e)
        {
            //清理元素
            listByte.Clear();
            //清空图片框
            img_photo.Source = null;
            //去除路径
            txt_Load.Text = string.Empty;

        }
        /// <summary>
        /// 文本失去焦点事件（验证电子邮箱）
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txt_Email_LostFocus(object sender, RoutedEventArgs e)
        {
            string strEmail = txt_Email.Text.Trim();
            ////使用正则表达式判断是否匹配    
            if (!Regex.IsMatch(strEmail, @"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"))
            {
                MessageBox.Show("Email地址有误，请重新输入！", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
                txt_Email.Text = "";
            }
        }
        /// <summary>
        /// 取消（退出窗口）
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            MessageBoxResult dr = MessageBox.Show("退出页面数据将不保留。", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Information);//弹出确定对话框
            if (dr == MessageBoxResult.OK)//如果点了确定按钮
            {
                //关闭窗口
                this.Close();
            }
        }

        /// <summary>
        /// 文本改变事件（验证电话号码）
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txt_PhoneNumber_TextChanged(object sender, RoutedEventArgs e)
        {
            /*
                 国内手机号码的规则:前3位为网络识别号；第4-7位为地区编码；第8-11位为用户号码。
                  现有手机号段:

                  移动：134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 198
                  联通：130 131 132 145 146 155 156 166 171 175 176 185 186  
                  电信：133 149 153 173 174 177 180 181 189 199 
                  虚拟运营商：170

                  整理后：130~139    14[5-9]    15[012356789]    166   17[0-8]    18[0-9]    19[8-9]
              */
            string strPhoneNumber = txt_PhoneNumber.Text.Trim();
            
            if (strPhoneNumber.Length == 11)
            {
                if (Tools.Utils.CheckTrueOrFalse.checkPhone(strPhoneNumber) == false)
                {
                    MessageBox.Show("手机号格式不对，请重新输入！", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
                    //清空文本
                    txt_PhoneNumber.Text = string.Empty;
                }
            }else if (strPhoneNumber.Length < 11)
            {
                MessageBox.Show("手机号格式不对或者输入的号码没有11位，请重新输入！", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
            }

        }


    }
}
